package com.nari.ncps.screen.service.impl.al;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nari.ncps.screen.entity.al.AlProdoperSales;
import com.nari.ncps.screen.entity.al.AlProdoperStock;
import com.nari.ncps.screen.entity.coal.CoalOpermonRtEffect;
import com.nari.ncps.screen.mapper.al.AlProdoperSalesMapper;
import com.nari.ncps.screen.service.al.AlProdoperSalesService;
import com.nari.ncps.screen.vo.al.AlProdoperSalesVO;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * <p>
 * 销售情况表 服务实现类
 * </p>
 *
 * @author xuesong
 * @since 2025-08-23
 */
@Service
public class AlProdoperSalesServiceImpl extends ServiceImpl<AlProdoperSalesMapper, AlProdoperSales> implements AlProdoperSalesService {

    @Override
    public List<AlProdoperSalesVO> getLiquidSalesData() {
        return getSalesDataByCategory((byte) 0);
    }

    @Override
    public List<AlProdoperSalesVO> getIngotSalesData() {
        return getSalesDataByCategory((byte) 1);
    }

    /**
     * 根据销售品类获取销售数据
     *
     * @param salesCategory 销售品类：0-铝液,1-铝锭
     * @return 销售情况VO列表
     */
    private List<AlProdoperSalesVO> getSalesDataByCategory(Byte salesCategory) {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        LocalDate startDate = currentDate.minusMonths(11);
        String prudctType = "0101";
        if(salesCategory==0){
            prudctType = "0101";
        }else if(salesCategory==1){
            prudctType = "0102";
        }

        // 计算6个月前的日期
        LocalDate sixMonthsAgo = LocalDate.now().minusMonths(5);

        // 查询最近6个月的数据
        LambdaQueryWrapper<AlProdoperSales> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(AlProdoperSales::getYear, sixMonthsAgo.getYear())
                .eq(AlProdoperSales::getOrgCode, 100360)
                .eq(AlProdoperSales::getProductType,prudctType)
                .eq(AlProdoperSales::getDateType,1)
                .orderByAsc(AlProdoperSales::getStatisticTime);
        List<AlProdoperSales> salesList1 = this.list(wrapper);
        // 转换为VO对象
        List<AlProdoperSalesVO> voList = new ArrayList<>();
        for (AlProdoperSales sales : salesList1) {
            AlProdoperSalesVO vo = new AlProdoperSalesVO();
            vo.setYear(sales.getYear());
            vo.setMonth(sales.getMonth());
            vo.setMonthPlanSales(sales.getMonthPlanSales());
            vo.setMonthActualSales(sales.getMonthActualSales());
            vo.setMonthCompletionRate(sales.getMonthCompletionRate());
//            vo.setMonthOverShort(sales.getMonthOverShort());
            if(sales.getMonthActualSales()!=null && sales.getMonthPlanSales()!=null){
                vo.setMonthOverShort(sales.getMonthActualSales().subtract(sales.getMonthPlanSales()));
            }else{
                vo.setMonthOverShort(sales.getMonthOverShort());
            }
            vo.setYoySalesRate(sales.getYoySalesRate());

            voList.add(vo);
        }
        
        // 查询去年同期6个月的数据
        LambdaQueryWrapper<AlProdoperSales> wrapper2 = Wrappers.lambdaQuery();
        wrapper2.eq(AlProdoperSales::getYear, LocalDate.now().getYear()-1)
                .eq(AlProdoperSales::getOrgCode, 100360)
                .eq(AlProdoperSales::getProductType,prudctType)
                .eq(AlProdoperSales::getDateType,1)
                .orderByAsc(AlProdoperSales::getStatisticTime);
        List<AlProdoperSales> salesList2 = this.list(wrapper2);

        // 转换为VO对象
        List<AlProdoperSalesVO> voList2 = new ArrayList<>();
        for (AlProdoperSales sales : salesList2) {
            AlProdoperSalesVO vo = new AlProdoperSalesVO();
            vo.setYear(sales.getYear());
            vo.setMonth(sales.getMonth());
            vo.setMonthPlanSales(sales.getMonthPlanSales());
            vo.setMonthActualSales(sales.getMonthActualSales());
            vo.setMonthCompletionRate(sales.getMonthCompletionRate());
//            vo.setMonthOverShort(sales.getMonthOverShort());
            if(sales.getMonthActualSales()!=null && sales.getMonthPlanSales()!=null){
                vo.setMonthOverShort(sales.getMonthActualSales().subtract(sales.getMonthPlanSales()));
            }else{
                vo.setMonthOverShort(sales.getMonthOverShort());
            }
            vo.setYoySalesRate(sales.getYoySalesRate());

            voList.add(vo);
        }

        return voList;
    }
    
//    /**
//     * 生成mock销售数据，覆盖最近12个月
//     *
//     * @param salesCategory 销售品类：0-铝液,1-铝锭
//     * @return mock销售数据列表
//     */
//    private List<AlProdoperSalesVO> generateMockSalesData(Byte salesCategory) {
//        List<AlProdoperSalesVO> mockDataList = new ArrayList<>();
//        LocalDate currentDate = LocalDate.now();
//
//        // 生成最近12个月的数据
//        for (int i = 11; i >= 0; i--) {
//            LocalDate targetDate = currentDate.minusMonths(i);
//            AlProdoperSalesVO vo = new AlProdoperSalesVO();
//
//            vo.setYear(targetDate.getYear());
//            vo.setMonth(targetDate.getMonthValue());
//
//            // 根据销售品类生成不同范围的数据
//            // 铝液：月计划2000-3000吨，铝锭：月计划5000-8000吨
//            BigDecimal basePlan = salesCategory == 0
//                    ? BigDecimal.valueOf(2000 + (i * 80) + (i % 3) * 50)
//                    : BigDecimal.valueOf(5000 + (i * 200) + (i % 4) * 100);
//
//            vo.setMonthPlanSales(basePlan);
//
//            // 实际销售量：计划量的85%-110%之间波动
//            double completionFactor = 0.85 + (i % 5) * 0.05 + (i % 3) * 0.03;
//            BigDecimal actualSales = basePlan.multiply(BigDecimal.valueOf(completionFactor))
//                    .setScale(2, RoundingMode.HALF_UP);
//            vo.setMonthActualSales(actualSales);
//
//            // 计算完成率：实际/计划 * 100
//            BigDecimal completionRate = actualSales.divide(basePlan, 4, RoundingMode.HALF_UP)
//                    .multiply(BigDecimal.valueOf(100))
//                    .setScale(2, RoundingMode.HALF_UP);
//            vo.setMonthCompletionRate(completionRate);
//
//            // 计算月超欠：实际-计划
//            BigDecimal overShort = actualSales.subtract(basePlan)
//                    .setScale(2, RoundingMode.HALF_UP);
//            vo.setMonthOverShort(overShort);
//
//            // 历史同期数据（去年同月）
//            BigDecimal historicalSales = basePlan.multiply(BigDecimal.valueOf(0.80 + (i % 4) * 0.05))
//                    .setScale(2, RoundingMode.HALF_UP);
//            vo.setHistoricalActualSales(historicalSales);
//
//            // 计算同比销售率：(今年-去年)/去年 * 100
//            if (historicalSales.compareTo(BigDecimal.ZERO) > 0) {
//                BigDecimal yoySalesRate = actualSales.subtract(historicalSales)
//                        .divide(historicalSales, 4, RoundingMode.HALF_UP)
//                        .multiply(BigDecimal.valueOf(100))
//                        .setScale(2, RoundingMode.HALF_UP);
//                vo.setYoySalesRate(yoySalesRate);
//            } else {
//                vo.setYoySalesRate(BigDecimal.ZERO);
//            }
//
//            mockDataList.add(vo);
//        }
//
//        return mockDataList;
//    }

}
